#include <iostream>
#include <pthread.h>
#include <vector>
#include <string>
#include <unistd.h>
#define NUM 5 //创建MUN个线程

//定义全局锁
pthread_mutex_t glock = PTHREAD_MUTEX_INITIALIZER;
//定义全局条件变量
pthread_cond_t gcond = PTHREAD_COND_INITIALIZER;

int gcnt = 1000;

void* Routine(void* args)
{
    std::string name = static_cast<const char*>(args);
    while(true)
    {
        pthread_mutex_lock(&glock);
        //直接让线程去等待
        pthread_cond_wait(&gcond,&glock);
        std::cout<<"我是"<<name<<"计算 gcnt = "<<gcnt<<std::endl;
        gcnt++;
        usleep(1000);
        pthread_mutex_unlock(&glock);
    }
    return nullptr;
}




int main()
{
    std::vector<pthread_t> threads;
    for(int i = 0; i < NUM;i++)
    {
        pthread_t tid;
        //把线程名字构建并传入线程
        char* name = new char[64];
        snprintf(name,64,"pthread-%d",i+1);
        int n = pthread_create(&tid,nullptr,Routine,name);
        if(n != 0)
            continue;
        threads.emplace_back(tid);
    }

    // //主线程每隔一秒唤醒一次等待队列中的线程
    // sleep(3);
    // while(true)
    // {
    //     std::cout<<"唤醒一个线程..."<<std::endl;
    //     pthread_cond_signal(&gcond);
    //     sleep(1);
    // }

    // //主线程每隔一秒唤醒所有等待队列中的线程
    // sleep(3);
    // while(true)
    // {
    //     std::cout<<"唤醒所有线程..."<<std::endl;
    //     pthread_cond_broadcast(&gcond);
    //     sleep(1);
    // }

    // for(int i = 0;i < NUM;i++)
    // {
    //     pthread_join(threads[i],nullptr);
    // }

    //return 0;
}